/**
 * Copyright (2017, ) Institute of Software, Chinese Academy of Sciences
 * Copyright (2017, ) Bocloud Co,. Lmt
 */
package cn.abcsys.devops.core.runtime;

import java.util.List;

/**
 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
 * @date   May 19, 2017
 * 
 * <code>Cluster<code>是多台主机的逻辑集合
 */
public interface Cluster {

	/************************************************
	 * 
	 *                 基本功能
	 *
	 ************************************************/
	/**
	 * 添加一台主机
	 * 
	 * @param host
	 * @return
	 * @throws Exception
	 */
	public Object addHost(Host host) throws Exception;
	
	/**
	 * 添加多台主机
	 * 
	 * @param hosts
	 * @return
	 * @throws Exception
	 */
	public Object addHost(List<Host> hosts) throws Exception;
	
	/**
	 * 删除一台主机
	 * 
	 * @param host
	 * @return
	 * @throws Exception
	 */
	public Object removeHost(Host host) throws Exception;
	
	/**
	 * 删除多台主机
	 * 
	 * @param hosts
	 * @return
	 * @throws Exception
	 */
	public Object removeHosts(List<Host> hosts) throws Exception;
	
	/**
	 * 为集群打上运行时标签
	 * 
	 * @param runtime
	 * @return
	 */
	public Object tag(Runtime runtime) throws Exception;
	
	/**
	 * 为集群解除运行时标签
	 * 
	 * @param runtime
	 * @return
	 */
	public Object untag(Runtime runtime) throws Exception;
	
	/**
	 * 获取集群信息
	 * 
	 * @return
	 */
	public Object getClusterInfo();
	
	/**
	 * 返回集群类型
	 * 
	 * @return
	 */
	public Cluster.Type getClusterType();
	
	/**
	 * 获取运行时信息
	 * 
	 * @return
	 */
	public Runtime getOwnedRuntime();
	
	/**
	 * 返回集群状态
	 * 
	 * @return
	 */
	public Cluster.Status getClusterStatus();
	
	/**
	 * 获取访问入口
	 * 
	 * @return
	 */
	public String getUUID();
	
	/**
	 * 获取访问入口
	 * 
	 * @return
	 */
	public String getUrl();
	
	/************************************************
	 * 
	 *                 高级功能
	 *
	 ************************************************/
	
	/**
	 * 获取所有主机
	 * 
	 * @return
	 */
	public List<Host> getAllHosts();
	
	
	/**
	 * 通过UUID定位ie主机
	 * 
	 * @param uuid
	 * @return
	 */
	public Host getHost(String uuid);
	
	/************************************************
	 * 
	 *                 辅助功能
	 *
	 ************************************************/
	/**
	 * 集群的类型
	 * 
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 19, 2017
	 *
	 */
	public static enum Type {
		/**
		 * 自研：容器集群方案
		 * 添加CONTAINER类型主机
		 */
		Kubernets,
		/**
		 * 自研：物理集群方案
		 */
		MESOS,
		/**
		 * 自研：容器集群方案
		 * 添加NATIVE类型主机
		 */
		SWARM,
		/**
		 * 集成：已有容器集群方案
		 * 添加CONTAINER类型主机
		 */
		OPENSHIFT,
	}
	
	/**
	 * 集群状态
	 * 
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 19, 2017
	 *
	 */
	public static enum Status {
		/**
		 * 正常状态，集群对外提供服务
		 */
		NORMAL,
		/**
		 * 维护状态，由于停机等原因不可使用
		 */
		MAINTENANCE
	}
}
